/*
 * spec.h
 *
 * 定数,構造体定義ヘッダ
 */

#ifndef __SPEC_H__
#define __SPEC_H__

#include <agl.h>

#define RASTER_PSG1 (18)   	/* PSG 駆動ラスタ番号その1 */
#define RASTER_PSG2 (147)	/* PSG 駆動ラスタ番号その2 */
/* 1P vs 2P 用背景スクロール開始ラスタ */
#define RASTER_SCROLL1 (0)
#define RASTER_SCROLL2 (140)

#define TABLEMIN (0)		/* テーブルの先頭 */
#define TABLESIZ (128)		/* 加速 減速 ブレーキ などのテーブルサイズ */

#define OBJ_SCALE (2)

#define DEFGREDGE (6.0)		/* 地面の端の座標初期値 */
#define DEFGRSCALE (0xC0)	/* 地面の大きさ初期値 */

/* テクスチャバッファ 0-7 を誰が使うか */
#define TBANK_GR (0)		/* use 0 */
#define TBANK_FONT (1)		/* use 1 */
#define TBANK_P1 (2)		/* use 2, 3 */
#define TBANK_P2 (4)		/* use 4, 5 */
#define TBANK_P3 (6)		/* use 6, 7 */
#define TBANK_MAX (8)

#define MIN_RAD (0.001)		/* 最小移動単位 */
#define MAX_RAD (10.0)		/* 最大移動単位 */
#define GETA_RAD (1000.0)	/* 速度正規化のゲタ 1/MIN_RAD */

/* 現在の進行方向 */
#define FB_FORWARD (1)
#define FB_STOP (0)
#define FB_BACKWARD (-1)

/* カメラアングル */
#define CAM_ANGLE (900)		/* 90度 */
/* カメラ倍率 */
#define CAM_ZOOM (0x200)	/* 512倍 */
/* パース */
#define SCALE_PERS (2)
/* 車のスケール */
#define SCALE_CAR (0x40)	/* 1/2倍 */

#define TIMER_X (96)		/* 1P vs COM 残り時間 X 表示位置 */
#define TIMER_Y (0)		/* 1P vs COM 残り時間 Y 表示位置 */

#define TIMER2_X (192)		/* 1P vs 2P 残り時間 X 表示位置 */
#define TIMER2_Y (0)		/* 1P vs 2P 残り時間 Y 表示位置 */

#define RADAR_X1   (20)    /* レーダーの位置 */
#define RADAR_Y1   (22)    /* レーダーの位置 */
#define RADAR_X2   (20)    /* レーダーの位置 */
#define RADAR_Y2   (142)    /* レーダーの位置 */

#define GROUND0 (0)
#define GROUND_MAX (64)

#define ROUND_MAX (3)		/* 全ラウンド数 */
#define CORE_MAX (4)		/* ボスコア最大数 */
#define BOSS_BODY_RATIO (0.7)	/* ボス本体矩形の割合 */

typedef float distance;		/* 距離単位 */
typedef float accel_t;		/* 加速度単位 */
typedef unsigned int degree;	/* 方向単位 */
typedef unsigned int time_t;	/* 時間単位 */
typedef int handle;
typedef int direct_t;
typedef void (*mfunc_t)(int);	/* 操作関数ポインタ */

/****************************************
  DOUBLEVIEW を define すると 2画面モードになります。
  BIRDVIEW を define すると真上から見たモードになります。
  同時に define してはいけません。
****************************************/
#define DOUBLEVIEW
#undef BIRDVIEW

typedef enum {
    FALSE,
    TRUE,
} boolean;

typedef enum {			/* ゲーム方法 */
  VSCOM,			/* 1P vs COM */
  VSPLAYER,			/* 1P vs 2P */
} playmode_t;

enum {				/* プレイヤー識別用 */
  PLAYER_DUMMY,			/* 機種選択用ダミー */
  PLAYER1,
  PLAYER2,
  PLAYER_MAX,
};

enum MachType {			/* 機体種類 */
  MT_HUMAN,			/* 1P vs COM 用操作 */
  MT_DWARF,
  MT_ELF,
  MT_BOSS,
  MT_HUMAN1,			/* 1P vs 2P 用 1P 操作 */
  MT_HUMAN2,			/* 1P vs 2P 用 2P 操作 */
  MACHINE_MAX,
};

enum {				/* location */
  LX, LY, LZ,
};

enum {				/* object minmax table index */
  MINX, MINY, MINZ, MAXX, MAXY, MAXZ,
};

typedef struct {
  float x;
  float y;
  float z;
} tvector;

typedef struct {
  object obj;
  float AccTable[TABLESIZ];	/* 加速テーブル */
  float EngBrakeTable[TABLESIZ]; /* 減速テーブル */
  float BrakeTable[TABLESIZ];	/* ブレーキテーブル */
  handle Handling;		/* ハンドリング係数 */
  float Bounce;			/* 反射係数 */
  float width;			/* 機体の横幅 */
  float h_plus;			/* 機体の正方向幅 */
  float h_minus;		/* 機体の負方向幅 */
  int color;			/* 機体色 */
} machtype;

typedef void (*pfunc_t)(machtype *); /* パラメータ初期化関数へのポインタ */

typedef struct {
  machtype *type;
  tvector vector;		/* 移動ベクタ */
  tvector colvec;		/* 衝突ベクタ */
  direct_t direct;		/* 現在向いている方向 */
  short fbflag;			/* 前進・後退フラグ */
  mfunc_t manFunc;		/* 操作関数へのポインタ */
} machine;

/* ４方向に対しての距離 */
typedef struct {
  distance  dFrontDist;		/* 前 */
  distance  dBackDist;		/* 後 */
  distance  dLeftDist;		/* 左 */
  distance  dRightDist;		/* 右 */
} QuadDist;

/* 機体のイメージ */
typedef struct {
  unsigned char *MachineName;   /* 名前 */
  char AccelLevel;              /* 加速 */
  char BrakeLevel;              /* ブレーキ */
  char Handling;                /* ハンドリング */
  char Weight;                  /* 重さ（跳ね返り具合） */
} machimage;

#endif /* __SPEC_H__ */
